/*
 *  Copyright (C) 2010 Fabien Renaud
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.boc.botv.model;
// Generated Jun 11, 2010 10:44:35 PM by Hibernate Tools 3.2.1.GA

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

/**
 * Représente en pari
 * @author Fabien Renaud
 */
@Entity
@Table(name = "Bet", catalog = "botv")
public class Bet implements java.io.Serializable {

  private static final SimpleDateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy");
  private static final SimpleDateFormat dateLongFormatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
  
  private Integer id;
  private User user;
  private String name;
  private String description;
  private Date creationTime;
  private Date startTime;
  private Date endTime;
  private int subsection;
  private boolean status;
  private Set<BetChoice> betChoices = new HashSet<BetChoice>(0);
  private Set<BetInstance> betInstances = new HashSet<BetInstance>(0);

  private String sectionName;
  /**
   * Crée un pari par défaut
   */
  public Bet() {
  }

  /**
   * Crée un pari
   * @param user Utilisateur ayant créé le pari
   * @param name Libellé du pari
   * @param description Description du pari
   * @param creationTime Date de création du pari
   * @param startTime Date de déut du par
   * @param endTime Date de fin du pari
   * @param subsection Sous catégorie à laquelle appartient le pari
   * @param status Actif (true) ou inactif
   */
  public Bet(User user, String name, String description, Date creationTime, Date startTime, Date endTime, int subsection, boolean status) {
    this.user = user;
    this.name = name;
    this.description = description;
    this.creationTime = creationTime;
    this.startTime = startTime;
    this.endTime = endTime;
    this.subsection = subsection;
    this.status = status;
  }
  /**
   * Crée un pari
   * @param user Utilisateur ayant créé le pari
   * @param name Libellé du pari
   * @param description Description du pari
   * @param creationTime Date de création du pari
   * @param startTime Date de déut du par
   * @param endTime Date de fin du pari
   * @param subsection Sous catégorie à laquelle appartient le pari
   * @param status Actif (true) ou inactif
   * @param betChoices Les choix associés au pari
   * @param betInstances
   */
  public Bet(User user, String name, String description, Date creationTime, Date startTime, Date endTime, int subsection, boolean status, Set<BetChoice> betChoices, Set<BetInstance> betInstances) {
    this.user = user;
    this.name = name;
    this.description = description;
    this.creationTime = creationTime;
    this.startTime = startTime;
    this.endTime = endTime;
    this.subsection = subsection;
    this.status = status;
    this.betChoices = betChoices;
    this.betInstances = betInstances;
  }

  /**
   * Obtient l'id du pari
   * @return L'id du pari
   */
  @Id
  @GeneratedValue(strategy = IDENTITY)
  @Column(name = "id", unique = true, nullable = false)
  public Integer getId() {
    return this.id;
  }

  /**
   * Modifie l'id du pari
   * @param id Nouvel id du pari
   */
  public void setId(Integer id) {
    this.id = id;
  }

  /**
   * Obtient l'utilisateur ayant créé le pari
   * @return L'utilisateur ayant créé le pari
   */
  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "creator", nullable = false)
  public User getUser() {
    return this.user;
  }

  /**
   * Modifie l'utilisateur ayant créé le pari
   * @param user Nouvel utilisateur créateur du pari
   */
  public void setUser(User user) {
    this.user = user;
  }

  /**
   * Obtient le libellé du pari
   * @return Libellé du pari
   */
  @Column(name = "name", nullable = false, length = 32)
  public String getName() {
    return this.name;
  }

  /**
   * Modifie le libellé du pari
   * @param name Nouveau libellé du pari
   */
  public void setName(String name) {
    this.name = name;
  }

  /**
   * Obtient la description du pari
   * @return Description du pari
   */
  @Column(name = "description", nullable = false, length = 256)
  public String getDescription() {
    return this.description;
  }

  /**
   * Modifie la description du pari
   * @param description Nouvelle description du pari
   */
  public void setDescription(String description) {
    this.description = description;
  }

  /**
   * Obtient la date de création du pari parsée en format long.
   * @return Date de création du pari
   */
  @Transient
  public String getCreationTimeFormatted() {
    return dateLongFormatter.format(creationTime);
  }

  /**
   * Obtient la date de création du pari
   * @return Date de création du pari
   */
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "creationTime", nullable = false, length = 19)
  public Date getCreationTime() {
    return this.creationTime;
  }

  /**
   * Modifie la date de création du pari
   * @param creationTime Nouvelle date de création du pari
   */
  public void setCreationTime(Date creationTime) {
    this.creationTime = creationTime;
  }

  /**
   * Obtient la date de début du pari parsée en format long.
   * @return Date de début du pari
   */
  @Transient
  public String getStartTimeFormatted() {
    return dateLongFormatter.format(startTime);
  }

  /**
   * Obtient la date de début du pari
   * @return Date de début du pari
   */
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "startTime", nullable = false, length = 19)
  public Date getStartTime() {
    return this.startTime;
  }

  /**
   * Modifie la date de début du pari
   * @param startTime Date de début du pari
   */
  public void setStartTime(Date startTime) {
    this.startTime = startTime;
  }

  /**
   * Obtient la date de fin du pari parsée en format long.
   * @return Date de fin du pari
   */
  @Transient
  public String getEndTimeFormatted() {
    return dateLongFormatter.format(endTime);
  }

  /**
   * Obtient la date de fin du pari
   * @return Date de fin du pari
   */
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "endTime", nullable = false, length = 19)
  public Date getEndTime() {
    return this.endTime;
  }

  /**
   * Modifie la date de fin du pari
   * @param endTime Nouvelle date de fin du pari
   */
  public void setEndTime(Date endTime) {
    this.endTime = endTime;
  }

  /**
   * Obtient la sous catégorie à laquelle appartient ce pari
   * @return Sous catégorie à laquelle appartient ce pari
   */
  @Column(name = "subsection", nullable = false)
  public int getSubsection() {
    return this.subsection;
  }

  /**
   * Modifie la sous catégorie à laquelle appartient ce pari
   * @param subsection Nouvelle sous catégorie à laquelle appartient ce pari
   */
  public void setSubsection(int subsection) {
    this.subsection = subsection;
  }

  /**
   * Obtient le statut du pari
   * @return true si li pari est activé
   */
  @Column(name = "status", nullable = false)
  public boolean isStatus() {
    return this.status;
  }

  /**
   * Modifie le le statut du pari
   * @param status true si le pari est activé
   */
  public void setStatus(boolean status) {
    this.status = status;
  }

  /**
   * Obtient les choix possibles pour ce pari
   * @return Choix du pari
   */
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "bet")
  public Set<BetChoice> getBetChoices() {
    return this.betChoices;
  }

  /**
   * Modifie les choix possibles pour ce pari
   * @param betChoices Nouveau choix du pari
   */
  public void setBetChoices(Set<BetChoice> betChoices) {
    this.betChoices = betChoices;
  }

  /**
   *
   * @return
   */
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "bet")
  public Set<BetInstance> getBetInstances() {
    return this.betInstances;
  }

  /**
   *
   * @param betInstances
   */
  public void setBetInstances(Set<BetInstance> betInstances) {
    this.betInstances = betInstances;
  }

  /**
   * Récupère le nom correspondant à la catégorie
   * @return le nom
   */
  @Transient
  public String getSectionName() {
      return sectionName;
  }

  /**
   * Initialise le nom de la catégorie avec la valeur passée en paramètre
   * @param sectionName
   */
  public void setSectionName(String sectionName) {
      this.sectionName = sectionName;
  }


}
